#include <vector>
#include <queue>
#include <string>
#include <unordered_map>
using namespace std;


class Solution
{
    typedef pair<string, int> PSI;
public:
    struct cmp
    {
        bool operator()(const PSI& a, const PSI& b) const
        {
            if(a.second == b.second)
            {
                return a.first < b.first;
            }
            return a.second > b.second;
        }
    };

    static vector<string> topKFrequent(vector<string>& words, int k)
    {
        vector<string> rv(k);
        unordered_map<string, int> hash;
        for(const auto& e : words)
            hash[e]++;
        priority_queue<PSI, vector<PSI>, cmp> heap;

        for(const auto& psi : hash)
        {
            heap.emplace(psi);//emplace：直接在容器中构造对象，避免了临时对象的创建和拷贝/移动操作，推荐用于复杂对象或需要高效插入的场景。
            if(heap.size() > k)
                heap.pop();
        }

        for(int i=k-1; i>=0; i--)
        {
            rv[i] = (heap.top()).first;
            heap.pop();
        }
        return rv;
    }
};